﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Data.Objects;
using SCEM.CompraProdutos;

namespace SCEM.DTO
{
    public class OrdemCompraProdutoDTO : IDTO<OrdemCompraProduto>
    {
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public DateTime DataCadastro { get; set; }
        [DataMember]
        public DateTime DataAlteracao { get; set; }
        [DataMember]
        public string ProdutoId { get; set; }
        [DataMember]
        public int Quantidade { get; set; }
        [DataMember]
        public string FornecedorId { get; set; }
        [DataMember]
        public string AutorizacaoFinanceiro { get; set; }
        [DataMember]
        public StatusOrdemCompra Status { get; set; }
        [DataMember]
        public string Observacao { get; set; }

        public OrdemCompraProduto ConvertToEntity(ObjectContext context)
        {
            OrdemCompraProduto ordemCompra = new OrdemCompraProduto();
            SCEMContainer scemContext = (SCEMContainer)context;
            Guid guidFornecedor;
            Guid guidProduto;
            Guid guidOrdem;
            bool novaEntidade = false;

            if (!string.IsNullOrEmpty(FornecedorId) && !String.IsNullOrEmpty(ProdutoId) &&
                Guid.TryParse(FornecedorId, out guidFornecedor) && Guid.TryParse(ProdutoId, out guidProduto))
            {
                // Verificar se o DTO representa uma ordem de compra que já está persistida no banco
                Guid.TryParse(Id, out guidOrdem);

                var queryOrdemCompra = from c in scemContext.OrdensCompraProduto
                                       where c.Id == guidOrdem
                                       select c;

                if (queryOrdemCompra.Count() == 1) // Utilizar entidade já existente no banco
                    ordemCompra = queryOrdemCompra.First();
                else
                {
                    // Tratar corretamente o caso de o DTO ser uma nova entidade a ser persistida no banco
                    if (ordemCompra.Id == Guid.Empty || ordemCompra.DataCadastro == DateTime.MinValue)
                    {
                        ordemCompra.Id = Guid.NewGuid();
                        ordemCompra.DataCadastro = DateTime.Now;
                        ordemCompra.Ativo = true;
                        ordemCompra.Status = (int)StatusOrdemCompra.NOVO;
                        novaEntidade = true;
                    }

                    // Nova ordem de compra, buscar o fornecedor e o produto associados a ela no banco
                    var queryFornecedor = from f in scemContext.Fornecedores
                                          where f.Id == guidFornecedor
                                          select f;
                    if (queryFornecedor.Count() == 1) // Fornecedor encontrado
                        ordemCompra.Fornecedor = queryFornecedor.First();

                    var queryProduto = from p in scemContext.Produtos
                                       where p.Id == guidProduto
                                       select p;
                    if (queryProduto.Count() == 1) // Produto encontrado
                        ordemCompra.Produto = queryProduto.First();
                }
            }

            // DTO -> Entidade
            ordemCompra.DataAlteracao = DateTime.Now;
            ordemCompra.Quantidade = Quantidade;
            ordemCompra.Observacao = Observacao;
            if (AutorizacaoFinanceiro != null)
                ordemCompra.AutorizacaoFinanceiro = AutorizacaoFinanceiro;
            if (!novaEntidade)
                ordemCompra.Status = (int)Status;

            return ordemCompra;

        }
    }
}
